【MySQL】UNION - SELECT結果の結合

【MySQL】UNION - SELECT結果の結合

MySQLのUNIONについて解説します。

検証環境

UNION

UNIONは複数SELECT文の取得結果をカラム単位で結合します。

次のpersonsテーブルとcompaniesテーブルで具体例を示します。

/* personsテーブル */
+--------+---------------+------+
| name   | tel           | age  |
+--------+---------------+------+
| TANAKA | AAA-AAAA-AAAA |   25 |
| SAITO  | BBB-BBBB-BBBB |   20 |
| SUZUKI | ZZZ-ZZZZ-ZZZZ |   30 |
+--------+---------------+------+

/* companiesテーブル */
+--------+---------------+
| name   | tel           |
+--------+---------------+
| ABC    | XXX-XXXX-XXXX |
| SIer   | YYY-YYYY-YYYY |
| SUZUKI | ZZZ-ZZZZ-ZZZZ |
+--------+---------------+

この2テーブルのnameカラムとtelカラムをUNIONで結合した結果は次の表です。

+--------+---------------+
| name   | tel           |
+--------+---------------+
| TANAKA | AAA-AAAA-AAAA |
| SAITO  | BBB-BBBB-BBBB |
| SUZUKI | ZZZ-ZZZZ-ZZZZ |
| ABC    | XXX-XXXX-XXXX |
| SIer   | YYY-YYYY-YYYY |
+--------+---------------+

基本構文

SELECT カラム名 FROM テーブルA UNION SELECT カラム名 FROM テーブルB

UNION句はSELECT文と合わせて使用します。

2つのSELECT文(SELECT カラム名 FROM テーブルASELECT カラム名 FROM テーブルB)の間にUNIONを記述します。

サンプル

mysql> SELECT * FROM persons;
+--------+---------------+------+
| name   | tel           | age  |
+--------+---------------+------+
| TANAKA | AAA-AAAA-AAAA |   25 |
| SAITO  | BBB-BBBB-BBBB |   20 |
| SUZUKI | ZZZ-ZZZZ-ZZZZ |   30 |
+--------+---------------+------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM companies;
+--------+---------------+
| name   | tel           |
+--------+---------------+
| ABC    | XXX-XXXX-XXXX |
| SIer   | YYY-YYYY-YYYY |
| SUZUKI | ZZZ-ZZZZ-ZZZZ |
+--------+---------------+
3 rows in set (0.00 sec)

mysql> SELECT name, tel FROM persons
    ___ih_hl_start
    -> UNION SELECT name, tel FROM companies;
    ___ih_hl_end
+--------+---------------+
| name   | tel           |
+--------+---------------+
| TANAKA | AAA-AAAA-AAAA |
| SAITO  | BBB-BBBB-BBBB |
| SUZUKI | ZZZ-ZZZZ-ZZZZ |
| ABC    | XXX-XXXX-XXXX |
| SIer   | YYY-YYYY-YYYY |
+--------+---------------+
5 rows in set (0.00 sec)

22行目がUNION句の部分です。

personsテーブルとcompaniesテーブルのnameカラムとtelカラムのレコードが1つの表になりました。

また、UNION句は重複データを除外します。

重複データを表示する場合はUNIONの後にALLを記述します。

mysql> SELECT name, tel FROM persons UNION ALL SELECT name, tel FROM companies;
+--------+---------------+
| name   | tel           |
+--------+---------------+
| TANAKA | AAA-AAAA-AAAA |
| SAITO  | BBB-BBBB-BBBB |
| SUZUKI | ZZZ-ZZZZ-ZZZZ |
| ABC    | XXX-XXXX-XXXX |
| SIer   | YYY-YYYY-YYYY |
| SUZUKI | ZZZ-ZZZZ-ZZZZ |
+--------+---------------+
6 rows in set (0.00 sec)